package com.xajh.duoduo.impl.process;

import com.xajh.duoduo.abs.AbsProcessor;
import com.xajh.duoduo.config.switchh.ProcessSwitch;
import com.xajh.duoduo.environment.PositionHolder;
import com.xajh.duoduo.eunm.position.*;
import com.xajh.duoduo.eunm.process.ProcessEnum;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.awt.event.InputEvent;

/**
 * 练级
 */
@Service
public class UpLevelProcessor extends AbsProcessor implements InitializingBean {
    //菜单窗口的位置
//    private final MenuPosition[] menuPositions = MenuPosition.values();
//    //主线任务的位置
//    private final MainTaskPosition[] mainTaskPositions = MainTaskPosition.values();
//    //回答问题的位置
//    private final AnswerQuestionPosition[] answerQuestionPositions = AnswerQuestionPosition.values();
    private final ReturnPosition[] returnPositions = ReturnPosition.values();
    private final ChapterEndingPosition[] chapterEndingPositions = ChapterEndingPosition.values();
    private final TouchPosition[] touchPositions = TouchPosition.values();
    private final ChapterEnding2Position[] chapterEnding2Positions = ChapterEnding2Position.values();
    @Autowired
    PositionHolder positionHolder;

    @Override
    public boolean process() throws Exception{
        Thread.sleep(5000);

        Robot robot = new Robot();
        robot.setAutoWaitForIdle(true);

//        // 移动鼠标到指定多开窗口
//        robot.mouseMove(300, 310);
//        // 延时10毫秒
//        robot.delay(1000);
////        Thread.sleep(1000);
//        // 按下鼠标左键
//        robot.mousePress(InputEvent.BUTTON1_MASK);
//        // 延时10毫秒
//        robot.delay(10);
////        Thread.sleep(1000);
//        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
//        robot.mouseRelease(InputEvent.BUTTON1_MASK);
//        //防止电脑卡顿，延时2s
//        robot.delay(2000);

        while (ProcessSwitch.upLevelSwitch.get()){

            //开始流程
            for (int i = 0; i < positionHolder.getMainTaskPositions().size(); i++){
                /**选择多开窗口*/
//                checkMenu(robot,i);

                /**点击回答问题*/
                //点击回答问题位置。
                //先点这个是因为 循环会在点击主线任务后结束。
                // 下次进入循环时，是点击了主线任务后，跑任务 和 切换窗口的时间。
                answerQuestion(robot,i);

//                //点击返回键
//                clickReturn(robot,i);

                //点击剧情结束键
                clickChapterEnding(robot,i);

                //关闭弹窗
                clickChapterEnding2(robot,i);

                //点击安抚位置
//                clickTouch(robot,i);

                /**点击主线任务*/
                clickMainTask(robot,i);
            }

        }
        return true;
    }

    private void clickChapterEnding2(Robot robot, int index) {
        robot.mouseMove(chapterEnding2Positions[index].getX(), chapterEnding2Positions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickTouch(Robot robot, int index) {
        robot.mouseMove(touchPositions[index].getX(), touchPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickChapterEnding(Robot robot, int index) {
        robot.mouseMove(chapterEndingPositions[index].getX(), chapterEndingPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickReturn(Robot robot, int index) {
        robot.mouseMove(returnPositions[index].getX(), returnPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    /**选择多开窗口*/
//    private void checkMenu(Robot robot,int index) throws Exception {
//        // 移动鼠标到指定多开窗口
//        robot.mouseMove(menuPositions[index].getX(), menuPositions[index].getY());
//        // 延时10毫秒
//        robot.delay(100);
//        // 按下鼠标左键
//        robot.mousePress(InputEvent.BUTTON1_MASK);
//        // 延时10毫秒
//        robot.delay(10);
//        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
//        robot.mouseRelease(InputEvent.BUTTON1_MASK);
//        //防止电脑卡顿，延时2s
//        robot.delay(2000);
//    }

    /**点击回答问题*/
    private void answerQuestion(Robot robot,int index) throws Exception{
        robot.mouseMove(positionHolder.getAnswerQuestionPositions().get(index).getX(), positionHolder.getAnswerQuestionPositions().get(index).getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    /**点击主线任务*/
    private void clickMainTask(Robot robot,int index) throws Exception{
        robot.mouseMove(positionHolder.getMainTaskPositions().get(index).getX(), positionHolder.getMainTaskPositions().get(index).getY());
        // 延时10毫秒
        robot.delay(100);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.group = ProcessEnum.UP_LEVEL.getType();
        this.globleId = this.generateGlobleId();
    }
}
